from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
'''
1 自定义文件存储类
2 在配置项中设置自定义文件存储类DEFAULT_FILE_STORAGE = 'meiduomall.utils.fastdfs.Fastdfsstorage.FDFSStorage'
'''
class FDFSStorage(Storage):
    def __init__(self, client_url=None, base_url=None):
        '''
        django调用存储类不传递任何参数,所以我们定义的client_url=None, base_url=None参数必须设置默认值
        :param client_url:
        :param base_url:
        '''
        if not client_url:
            client_url = settings.FDFS_CLIENT_CONF
        self.client_url = client_url
        if not base_url:
            base_url = settings.FDFS_NGINX_URL
        self.base_url = base_url
    def _save(self, name, content):
        '''

        :param name:文件的名字
        :param content: 文件内容file的对象,可以通过content.read()获取file内容
        :return: 返回值是保存在数据库中的路径
        '''
        # 创建fastdfs的客户端对象
        # Fdfs_client('客户端配置文件.conf的路径')
        client = Fdfs_client(self.client_url)
        res = client.upload_by_buffer(content.read())
        # 判断文件是否上传成功
        if res.get('Status') != 'Upload successed.':
            raise Exception('上传文件到FDFS失败')
        file_id = res.get('Remote file_id')
        return file_id
    def exists(self, name):
        '''
        django在调用_save()之前,会先调用exists方法,来判断上传文件跟已经存储的文件是否重名
        :param name: 上传文件的name
        :return: 因为存储到FDFS的文件名是不可能重名的,所以返回False
        '''
        return False

    def url(self, name):
        '''

        :param name: image的内容也就是图片路径 模型类对象.image.url
        :return: 返回路径路径
        '''
        name = self.base_url + name
        return name